﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Framework.Modelo.ExtensionesBásicas;
using Framework.Atributos;
using Framework.Mensajes.Modelo;
using System.Reflection;

namespace Framework.Modelo
{
    public class Objeto : IObjeto
    {
        #region Private Fields

        protected Guid guid;
        protected EstadoDePersistencia estadoDePersistencia;
        protected String nombre;
        protected IObjeto tipo;

        #endregion 

        #region Public Constructors

        public Objeto()
        {
            this.guid = Guid.NewGuid();
            this.estadoDePersistencia = EstadoDePersistencia.Creado;
            this.nombre = ValoresPredeterminados.SinNombre;
        }

        #endregion

        #region IObjeto Members

        [PersistenciaAttribute]
        public Guid Guid
        {
            get { return this.guid; }
            set { this.guid = value; }
        }

        public EstadoDePersistencia EstadoDePersistencia
        {
            get { return this.estadoDePersistencia; }
        }

        [PersistenciaAttribute]
        public String Nombre
        {
            get { return this.nombre; }
            set { this.nombre = value; }
        }

        public IObjeto Tipo
        {
            get 
            {
                if (this.tipo == null)
                {
                    this.tipo = new Objeto();
                    this.tipo.Nombre = ValoresPredeterminados.ObjetoGenerico;
                }
                return this.tipo;
            }
            set { this.tipo = value; }
        }

        #endregion

        public override bool Equals(object obj)
        {
            bool resultado = false;
            if (obj!=null)
                resultado = Reflection.Equals(this, (IObjeto)obj);
            return resultado;
        }
    }
}
